﻿Imports Microsoft.Office.Interop.Excel
Imports System.Windows.Controls.Primitives
Imports System.Data
Imports System.Collections.ObjectModel

Class FLConciliaCupones

    Private tituloMensaje As String = "Conciliación de Cupones"
    Dim fechaIni As DateTime
    Dim fechaCons As DateTime
    Private fechasInhabiles As List(Of CFechaNoLab)
    Private listaETF As List(Of String)
    Private servicioGeneral As CServiciosGenerales
    Private generalCupones As CSGeneralCupones
    Private lstCatalogoDiv As New List(Of CTCatalogoGenerico)

    Public Sub New()
        servicioGeneral = New CServiciosGenerales()
        generalCupones = New CSGeneralCupones()
        fechasInhabiles = servicioGeneral.ObtenerFechasNoLab(1)
        listaETF = New List(Of String)
        InitializeComponent()
        fechaIni = Date.Now
        Dim catalogo = New CTCatalogoGenerico()
        lstCatalogoDiv = catalogo.ObtieneCatalogo(13)
        If Not ValidaFechaHabil(fechaIni) Then
            fechaIni = GetSiguienteDiaHabil(fechaIni)
        End If
        fechaCons = GetSiguienteDiaHabil(fechaIni)

        Me.dtpFechaRF.Text = fechaIni.ToString("dd/MM/yyyy")
        Me.lblFechaConciliacionRF.Content = fechaCons.ToString("dd/MM/yyyy")

        Me.lblFechaRV.Content = fechaIni.ToString("dd/MM/yyyy")
        'Me.lblFechaConciliacionRV.Content = fechaCon.ToString("dd/MM/yyyy")

        Mouse.OverrideCursor = Nothing
    End Sub

    Private Function ValidaFechaHabil(ByVal fecha As Date) As Boolean
        For Each fechain As CFechaNoLab In fechasInhabiles
            If fechain.Fechanolab.ToString("dd/MM/yyyy") = fecha.ToString("dd/MM/yyyy") Then
                Return False
            End If
        Next
        If fecha.DayOfWeek() = DayOfWeek.Saturday Or fecha.DayOfWeek() = DayOfWeek.Sunday Then
            Return False
        End If
        Return True
    End Function

    Private Function GetSiguienteDiaHabil(ByVal fecha As DateTime) As DateTime
        Dim flag As Boolean = False
        While Not flag
            fecha = fecha.AddDays(1)
            flag = ValidaFechaHabil(fecha)
        End While
        Return fecha
    End Function

#Region "TAB RENTA FIJA"

    Private Sub dtpFechaRF_SelectedDateChanged(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs)
        Dim fecha As Date = Date.Parse(Me.dtpFechaRF.Text)
        If Not ValidaFechaHabil(fecha) Then
            fecha = GetSiguienteDiaHabil(fecha)
        End If
        Me.dtpFechaRF.Text = fecha.ToString("dd/MM/yyyy")
        fecha = GetSiguienteDiaHabil(fecha)
        Me.lblFechaConciliacionRF.Content = fecha.ToString("dd/MM/yyyy")
    End Sub

    Private Sub btnBuscaDiferencias_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnBuscaDiferencias.Click
        Mouse.OverrideCursor = Cursors.Wait
        If ValidarBuscaDif() Then
            Dim eventoBit = CBitacoraFRIDA.GenerarEvento(CBitacoraFRIDA.CveEventosBit.CONCILIA_CUPONES_RF, CServiciosMacrosSyBaseDB.IDUSUARIO, "FLConciliaCupones.xaml -> btnBuscaDiferencias")
            Try
                eventoBit.GuadarDetalle("Fecha", Me.dtpFechaRF.Text)
                eventoBit.GuadarDetalle("Fecha Concilia", Me.lblFechaConciliacionRF.Content)
                Dim lista = generalCupones.ObtieneConciliacion(Date.Parse(Me.dtpFechaRF.Text), Date.Parse(Me.lblFechaConciliacionRF.Content))
                Dim listaCombo = generalCupones.ObtieneInstrumentos(lista)
                Me.grdDiferenciasEventos.ItemsSource = lista
                Me.grdDiferenciasEventos.Items.Refresh()
                Me.cmbInstrumento.ItemsSource = listaCombo
                eventoBit.ActualizarFechaFinDelEvento()
                Me.lblTipoInstD.Content = ""
                Me.lblTipoInstV.Content = ""
                Me.grdEnvioEventos.ItemsSource = Nothing
                If lista.Count = 0 Then
                    MessageBox.Show("No existe información", tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Information)
                End If
            Catch ex As Exception
                Dim errorBit = eventoBit.GuardarError("Error al conciliar Cupones: " & ex.Message)
                eventoBit.ActualizarFechaFinDelEvento()
                Mouse.OverrideCursor = Nothing
                MessageBox.Show("Error TI500. Error al conciliar cupones: " & ex.Message & " -Codigo:" & errorBit.IdError, tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Error)
            End Try

        End If
        Mouse.OverrideCursor = Nothing


    End Sub

    Private Sub grdDiferenciasEventos_LoadingRow(ByVal sender As System.Object, ByVal e As DataGridRowEventArgs) Handles grdDiferenciasEventos.LoadingRow
        Dim concilia As CTConciliaCupones = TryCast(e.Row.Item, CTConciliaCupones)
        Dim row As DataRowView = TryCast(e.Row.Item, DataRowView)
        If concilia.Origen.Equals("EVENTOS") Then
            e.Row.Background = New SolidColorBrush(Color.FromArgb(255, 242, 220, 219))
        End If
        If concilia.Origen.Equals("VALMER") Then
            e.Row.Background = New SolidColorBrush(Color.FromArgb(255, 220, 230, 241))
        End If
    End Sub

    Private Function ValidarBuscaDif() As Boolean

        Dim fechaValmer = generalCupones.ObtenerFechaValmer(DateTime.Parse(Me.dtpFechaRF.Text))

        If Me.dtpFechaRF.Text <> fechaValmer.ToString("dd/MM/yyyy") Then
            MessageBox.Show("No existe vector de valmer para la fecha " & Me.dtpFechaRF.Text, tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Exclamation)
            Return False
        End If


        Return True

    End Function

    Private Sub cmbInstrumento_SelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles cmbInstrumento.SelectionChanged
        Mouse.OverrideCursor = Cursors.Wait
        Try
            Dim instrumento As CTConciliaCupones
            instrumento = Me.cmbInstrumento.SelectedItem
            If (instrumento IsNot Nothing) Then
                Me.lblTipoInstD.Content = "FIJO"
                If generalCupones.ObtieneTipoInstrumentos(instrumento.Instrumento).StartsWith("FLO") Then
                    Me.lblTipoInstD.Content = "FLOTANTE"
                End If

                Me.lblTipoInstV.Content = instrumento.TipoInstrumentoValmer

                'If ((instrumento.TipoInstrumento.StartsWith("FLO") and Not Me.cmbTipoInstrumento.SelectedValue.Content.ToString().StartsWith("FLO")) _
                '    or (Not instrumento.TipoInstrumento.StartsWith("FLO") and Me.cmbTipoInstrumento.SelectedValue.Content.ToString().StartsWith("FLO"))) Then
                '    If Me.cmbTipoInstrumento.SelectedIndex = 1 Then
                '        Me.cmbTipoInstrumento.SelectedIndex = 0
                '    Else
                '        Me.cmbTipoInstrumento.SelectedIndex = 1
                '    End If
                'End If
            End If

        Catch ex As Exception
            Mouse.OverrideCursor = Nothing
        End Try

        Mouse.OverrideCursor = Nothing
    End Sub

    Private Sub btnPegarEventos_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnPegarEventos.Click
        Dim eventoBit = CBitacoraFRIDA.GenerarEvento(CBitacoraFRIDA.CveEventosBit.PEGAR_FLUJOS, CServiciosMacrosSyBaseDB.IDUSUARIO, "FLConciliaCupones.xaml -> btnPegarEventos")
        Dim datos As CDatosEnFormatoX
        datos = CUtileria.ObtenerDatosClipboard(vbLf, vbTab)
        Dim listaFlujos As List(Of CFlujoValmer) = New List(Of CFlujoValmer)
        Dim flujo As CFlujoValmer
        If datos.Datos.length = 0 Then
            eventoBit.GuadarDetalle("registros", datos.Datos.length)
            eventoBit.ActualizarFechaFinDelEvento()
            Exit Sub
        End If

        If datos Is Nothing Then
            eventoBit.GuadarDetalle("registros", "0")
            Dim errorBit = eventoBit.GuardarError("Error al pegar flujos: No se pudo copiar los datos")
            eventoBit.ActualizarFechaFinDelEvento()
            Throw New Exception("No se pudo copiar los datos" & " -Codigo:" & errorBit.IdError)
        End If


        Try
            eventoBit.GuadarDetalle("registros", datos.NumeroRenglones)
            For fila = 0 To datos.NumeroRenglones - 1
                flujo = New CFlujoValmer()
                If datos.NumeroColumnas.Max - 1 >= 0 Then
                    Dim fecha = CType(datos.Datos(fila)(0), Date)
                    flujo.Fecha = fecha
                End If

                If datos.NumeroColumnas.Max - 1 >= 1 Then
                    Dim dias = CType(datos.Datos(fila)(1), Integer)
                    flujo.Dias = dias
                End If

                If datos.NumeroColumnas.Max - 1 >= 2 Then
                    Dim periodo = CType(datos.Datos(fila)(2), Integer)
                    flujo.Periodo = periodo
                End If

                If datos.NumeroColumnas.Max - 1 >= 3 Then
                    Dim intereses = CType(datos.Datos(fila)(3), Decimal)
                    flujo.Intereses = intereses.ToString("#0.000000000")
                End If

                If datos.NumeroColumnas.Max - 1 >= 4 Then
                    Dim valornom = CType(datos.Datos(fila)(4), Integer)
                    flujo.ValorNominal = valornom
                End If

                If datos.NumeroColumnas.Max - 1 >= 5 Then
                    Dim amortizaciones = CType(datos.Datos(fila)(5), Integer)
                    flujo.Amortizacion = amortizaciones
                End If

                If datos.NumeroColumnas.Max - 1 >= 6 Then
                    Dim flujoval = CType(datos.Datos(fila)(6), Decimal)
                    flujo.Flujo = flujoval.ToString("#0.000000000")
                End If

                flujo.Settlement = ""
                listaFlujos.Add(flujo)
            Next
            Me.grdEnvioEventos.ItemsSource = listaFlujos
            Me.lblRegistros.Content = "Numero de Registros : " & listaFlujos.Count()
            eventoBit.ActualizarFechaFinDelEvento()
        Catch ex As Exception
            Dim errorBit = eventoBit.GuardarError("Error al pegar flujos: " & ex.Message)
            eventoBit.ActualizarFechaFinDelEvento()
            MessageBox.Show("No se pudo terminar de copiar los datos debido a que no coinciden con el formato especificado para cada celda." & " -Codigo:" & errorBit.IdError, tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Error)
        End Try

    End Sub

    Private Sub btnEnvioEventos_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnEnvioEventos.Click
        Mouse.OverrideCursor = Cursors.Wait
        If ValidarEnvio() Then
            Dim listaFl As List(Of CFlujoValmer)
            listaFl = Me.grdEnvioEventos.ItemsSource
            Dim instrumento As CTConciliaCupones
            instrumento = Me.cmbInstrumento.SelectedItem

            Dim sMsgError As String = ""
            If MessageBox.Show("¿Desea enviar flujos a Decalog?", tituloMensaje, MessageBoxButton.YesNo, MessageBoxImage.Question) = MessageBoxResult.Yes Then
                Dim eventoBit = CBitacoraFRIDA.GenerarEvento(CBitacoraFRIDA.CveEventosBit.ENVIO_EVENTOS_RF, CServiciosMacrosSyBaseDB.IDUSUARIO, "FLConciliaCupones.xaml -> btnEnvioEventos")
                Try
                    Dim NomArchivo As String = ""
                    Dim razonInstrumValmer As New CRazonInstrumento(0, "", 0, 0)
                    Dim tipoInst As String = Me.lblTipoInstV.Content.ToString()
                    If (tipoInst.Equals("")) Then
                        tipoInst = Me.lblTipoInstD.Content.ToString()
                    End If

                    eventoBit.GuadarDetalle("Inst. Num", instrumento.InstNum)
                    eventoBit.GuadarDetalle("Tipo Inst.", tipoInst)
                    eventoBit.GuadarDetalle("Moneda", Me.cmbMoneda.SelectedValue.Content)
                    If generalCupones.Check(razonInstrumValmer, tipoInst, instrumento.InstNum, sMsgError) Then
                        If generalCupones.ConstruirArchivoValmerDecalog(instrumento.InstNum, listaFl, razonInstrumValmer, Me.cmbMoneda.SelectedValue.Content.ToString(), NomArchivo, sMsgError) Then
                            generalCupones.EjecutarProceso(NomArchivo)
                            MessageBox.Show("Operación Exitosa", tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Information)
                        Else
                            Dim errorBit = eventoBit.GuardarError("Error al enviar eventos: " & sMsgError)
                            MessageBox.Show("La carga a Decalog no fue exitosa debido a: " & sMsgError & " -Codigo:" & errorBit.IdError, tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Error)
                        End If

                    Else
                        Dim errorBit = eventoBit.GuardarError("Error al enviar eventos: " & sMsgError)
                        MessageBox.Show("Error TI500. Error al enviar flujos a Decalog: " & sMsgError & " -Codigo:" & errorBit.IdError, tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Error)
                    End If
                    eventoBit.ActualizarFechaFinDelEvento()
                Catch ex As Exception
                    Dim errorBit = eventoBit.GuardarError("Error al enviar eventos: " & ex.Message)
                    eventoBit.ActualizarFechaFinDelEvento()
                    Mouse.OverrideCursor = Nothing
                    MessageBox.Show("Error TI500. Error al enviar flujos a Decalog: " & ex.Message & " -Codigo:" & errorBit.IdError, tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Error)
                End Try


            End If
        End If
        Mouse.OverrideCursor = Nothing
    End Sub

    Private Function ValidarEnvio()
        Dim instrumento As CTConciliaCupones
        instrumento = Me.cmbInstrumento.SelectedItem
        If instrumento Is Nothing Then
            MessageBox.Show("Debe seleccionar un instrumento.", tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Exclamation)
            Return False
        End If
        If Me.grdEnvioEventos.Items.Count = 0 Then
            MessageBox.Show("Debe agregar flujos para el instrumento seleccionado.", tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Exclamation)
            Return False
        End If

        Return True
    End Function

#End Region

#Region "TAB RENTA VARIABLE"

    Private Sub btnPegarSiBolsa_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnPegarSiBolsa.Click
        Dim eventoBit = CBitacoraFRIDA.GenerarEvento(CBitacoraFRIDA.CveEventosBit.PEGAR_SIBOLSA, CServiciosMacrosSyBaseDB.IDUSUARIO, "FLConciliaCupones.xaml -> btnPegarSiBolsa")
        Me.grdEnvioEventosRV.ItemsSource = Nothing
        Dim datos As CDatosEnFormatoX
        datos = CUtileria.ObtenerDatosClipboard(vbLf, vbTab)
        Dim listaSiBolsa As List(Of CTConciliaCupones) = New List(Of CTConciliaCupones)
        Dim sibolsa As CTConciliaCupones
        If datos.Datos.length = 0 Then
            eventoBit.GuadarDetalle("registros", datos.Datos.length)
            eventoBit.ActualizarFechaFinDelEvento()
            Exit Sub
        End If

        If datos Is Nothing Then
            eventoBit.GuadarDetalle("registros", "0")
            Dim errorBit = eventoBit.GuardarError("Error al pegar SIBOLSA: No se pudo copiar los datos")
            eventoBit.ActualizarFechaFinDelEvento()
            Throw New Exception("No se pudo copiar los datos" & " -Codigo:" & errorBit.IdError)
        End If

        Dim found As List(Of CTCatalogoGenerico)
        Try
            eventoBit.GuadarDetalle("registros", datos.NumeroRenglones)
            For fila = 0 To datos.NumeroRenglones - 1
                sibolsa = New CTConciliaCupones()
                If datos.NumeroColumnas.Max - 1 >= 0 Then
                    Dim emisora = CType(datos.Datos(fila)(0), String)
                    sibolsa.Emisora = emisora.Trim()
                End If

                If datos.NumeroColumnas.Max - 1 >= 1 Then
                    Dim tipoDerecho = CType(datos.Datos(fila)(1), String)
                    sibolsa.TipoDerecho = tipoDerecho.Trim()
                    found = lstCatalogoDiv.FindAll(Function(x) x.Valor.Equals(sibolsa.TipoDerecho))
                    sibolsa.Tipo = "99999"
                    sibolsa.EvtTyp = "x"
                    If found.Count() > 0 Then
                        sibolsa.Tipo = found(0).Clave.ToString()
                        sibolsa.EvtTyp = "DIVREC"
                    End If

                End If

                If datos.NumeroColumnas.Max - 1 >= 2 Then
                    If datos.Datos(fila)(2) <> "" Then
                        Dim fechaPago = CType(datos.Datos(fila)(2), Date)
                        sibolsa.FechaPago = fechaPago
                    End If

                End If

                If datos.NumeroColumnas.Max - 1 >= 3 Then
                    If datos.Datos(fila)(3) <> "" Then
                        Dim fechaExcupon = CType(datos.Datos(fila)(3), Date)
                        sibolsa.FechaExcupon = fechaExcupon
                    End If
                End If

                listaSiBolsa.Add(sibolsa)

            Next
            listaSiBolsa = listaSiBolsa.OrderBy(Function(x) x.Tipo).ToList()
            Me.grdSiBolsa.ItemsSource = listaSiBolsa
            eventoBit.ActualizarFechaFinDelEvento()
        Catch ex As Exception
            Dim errorBit = eventoBit.GuardarError("Error al pegar SIBOLSA: " & ex.Message)
            eventoBit.ActualizarFechaFinDelEvento()
            MessageBox.Show("No se pudo terminar de copiar los datos debido a que no coinciden con el formato especificado para cada celda." & " -Codigo:" & errorBit.IdError, tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Error)
        End Try

    End Sub

    Private Sub btnEliminarETF_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnEliminarETF.Click
        listaETF = New List(Of String)
        MessageBox.Show("La lista fue eliminada", tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Information)
    End Sub

    Private Sub btnCargarETF_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnCargarETF.Click
        Me.grdEnvioEventosRV.ItemsSource = Nothing
        Dim index As Integer = 0
        Dim eventoBit = CBitacoraFRIDA.GenerarEvento(CBitacoraFRIDA.CveEventosBit.IMPORTAR_ETF, CServiciosMacrosSyBaseDB.IDUSUARIO, "FLConciliaCupones.xaml -> btnCargarETF")
        Try
            Dim blnArchivoElegido As Boolean
            Dim columnaNombre As String = "Codigo"
            Dim dlg As New Microsoft.Win32.OpenFileDialog()
            dlg.FileName = ""
            dlg.Filter = "Excel documents|*.xls;*.xlsx"
            blnArchivoElegido = dlg.ShowDialog()

            If blnArchivoElegido Then

                Dim wbk As Workbook
                Dim hoja As Worksheet
                Dim Aplicacion As _Application
                Dim rango As Range
                Dim indice As Integer = 0, indiceAux As Integer = 2, TotalRenglones As Integer, TotalColumnas As Integer

                Mouse.OverrideCursor = Cursors.Wait

                Try
                    Aplicacion = GetObject(, "Excel.Application")
                Catch ex As Exception
                    Aplicacion = CreateObject("Excel.Application")
                End Try

                Try
                    eventoBit.GuadarDetalle("File", dlg.FileName)
                    Aplicacion.DisplayAlerts = False
                    Aplicacion.Visible = False
                    wbk = Aplicacion.Workbooks.Open(dlg.FileName)

                Catch ex As Exception
                    Dim errorBit = eventoBit.GuardarError("Error al importar ETF: " & ex.Message)
                    eventoBit.ActualizarFechaFinDelEvento()
                    Mouse.OverrideCursor = Nothing
                    MessageBox.Show("Error TI500. " & ex.Message & " Si esta modificando otro libro favor de terminar e intentar nuevamente" & " -Codigo:" & errorBit.IdError, "Carga archivo", MessageBoxButton.OK, MessageBoxImage.Error)

                    Exit Sub
                End Try
                hoja = wbk.Sheets(1)

                rango = hoja.UsedRange

                TotalRenglones = rango.Rows.Count

                TotalColumnas = rango.Columns.Count
                eventoBit.GuadarDetalle("TotalRenglones", TotalRenglones)
                eventoBit.GuadarDetalle("TotalColumnas", TotalColumnas)
                Dim columnaInstrumento As Integer = 1
                'For indexCol As Integer = 1 To TotalColumnas
                '    If Not hoja.Cells(1, indexCol).Value2 Is Nothing Then
                '        If columnaNombre = hoja.Cells(1, indexCol).Value2 Then
                '            columnaInstrumento = indexCol
                '            Exit For
                '        End If
                '    End If
                'Next

                Dim instrumento As String = ""
                'Dim emisora As String = ""
                'Dim tv As String = ""
                'Dim serie As String = ""
                For indexRow As Integer = 2 To TotalRenglones
                    If Not hoja.Cells(indexRow, columnaInstrumento).Value2 Is Nothing Then
                        'emisora = ""
                        'serie = ""
                        'tv = ""
                        instrumento = hoja.Cells(indexRow, columnaInstrumento).Value2
                        'En caso de Procesar instrumento
                        'If instrumento.IndexOf("-") > 0 Then
                        '    emisora = instrumento.Substring(0,instrumento.IndexOf("-"))
                        '    instrumento = instrumento.Replace(emisora, "")
                        '    instrumento = instrumento.Substring(1)
                        '    emisora = emisora.Replace("-","")
                        '    emisora = emisora.Trim()
                        'End If

                        'If instrumento.IndexOf("-") > 0 Then
                        '    tv = instrumento.Substring(0,instrumento.IndexOf("-"))
                        '    instrumento = instrumento.Replace(tv, "")
                        '    instrumento = instrumento.Substring(1) 
                        '    tv = tv.Replace("-","")
                        '    tv = tv.Trim()


                        'End If

                        'serie = instrumento
                        'serie = serie.Replace("-","")
                        'serie = serie.Trim()

                        'instrumento = tv & "_" & emisora & "_" & serie

                        listaETF.Add(instrumento)
                    End If
                Next
                wbk.Close()
                eventoBit.ActualizarFechaFinDelEvento()
                MessageBox.Show("Operación Exitosa", tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Information)
                Mouse.OverrideCursor = Nothing

            End If
        Catch ex As Exception
            Dim errorBit = eventoBit.GuardarError("Error al importar ETF: " & ex.Message)
            eventoBit.ActualizarFechaFinDelEvento()
            Mouse.OverrideCursor = Nothing
            MessageBox.Show("Error TI500. Al cargar archivo: " & ex.Message & " -Codigo:" & errorBit.IdError, "Carga archivo", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try

    End Sub

    Private Sub btnBuscaDiferenciasRV_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnBuscaDiferenciasRV.Click
        Mouse.OverrideCursor = Cursors.Wait
        If ValidarBuscaDifRV() Then
            Dim eventoBit = CBitacoraFRIDA.GenerarEvento(CBitacoraFRIDA.CveEventosBit.CONCILIA_CUPONES_RV, CServiciosMacrosSyBaseDB.IDUSUARIO, "FLConciliaCupones.xaml -> btnBuscaDiferenciasRV")
            Try
                Dim listaSiBolsa As List(Of CTConciliaCupones) = Me.grdSiBolsa.ItemsSource
                eventoBit.GuadarDetalle("Fecha", Me.lblFechaRV.Content)
                eventoBit.GuadarDetalle("chkPosicion", Me.chkPosicion.IsChecked)
                eventoBit.GuadarDetalle("chkETF", Me.chkETF.IsChecked)
                Dim lista = generalCupones.ObtieneConciliacionRV(listaETF, listaSiBolsa, Date.Parse(Me.lblFechaRV.Content), Me.chkPosicion.IsChecked, Me.chkETF.IsChecked)
                Dim monedas As ObservableCollection(Of String) = New ObservableCollection(Of String)
                monedas.Add("MXN")
                monedas.Add("EUR")
                monedas.Add("USD")
                Dim listaFactor As List(Of CTConciliaCupones) = Me.grdEnvioEventosRV.ItemsSource
                Dim instNum, mercado, tipoDerecho
                Dim cuponFactor As CTConciliaCupones
                For Each cuponRV As CTConciliaCupones In lista
                    If cuponRV.Instrumento.StartsWith("1ASP_") Or cuponRV.Instrumento.StartsWith("1ISP_") Or cuponRV.Instrumento.StartsWith("1E_") Then
                        If cuponRV.FechaPago <> Nothing Then
                            cuponRV.FechaSugerida = GetSiguienteDiaHabil(cuponRV.FechaPago)
                        End If
                        If cuponRV.EvtNum = 0 Then
                            cuponRV.CurCod = "USD"
                        End If
                    End If
                    cuponRV.Moneda = monedas

                    'Recupera Factor
                    If listaFactor IsNot Nothing Then
                        instNum = cuponRV.InstNum
                        mercado = cuponRV.Mercado
                        tipoDerecho = cuponRV.TipoDerecho
                        cuponFactor = listaFactor.Find(Function(x) x.InstNum = instNum And x.Mercado = mercado And x.TipoDerecho = tipoDerecho And x.Factor <> 0)
                        If cuponFactor IsNot Nothing Then
                            cuponRV.Factor = cuponFactor.Factor
                        End If
                    End If
                    'End Recupera Factor
                Next

                lista = lista.OrderBy(Function(x) x.Mercado).ToList()
                Me.grdEnvioEventosRV.ItemsSource = lista
                If lista.Count = 0 Then
                    MessageBox.Show("No existe información", tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Information)
                End If
                eventoBit.ActualizarFechaFinDelEvento()
            Catch ex As Exception
                Dim errorBit = eventoBit.GuardarError("Error al conciliar cupones: " & ex.Message)
                eventoBit.ActualizarFechaFinDelEvento()
                Mouse.OverrideCursor = Nothing
                MessageBox.Show("Error TI500. Error al conciliar cupones: " & ex.Message & " -Codigo:" & errorBit.IdError, tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Error)
            End Try

        End If
        Mouse.OverrideCursor = Nothing

    End Sub

    Private Sub grdEnvioEventosRV_LoadingRow(ByVal sender As System.Object, ByVal e As DataGridRowEventArgs) Handles grdEnvioEventosRV.LoadingRow
        Dim concilia As CTConciliaCupones = TryCast(e.Row.Item, CTConciliaCupones)
        Dim row As DataRowView = TryCast(e.Row.Item, DataRowView)

        If concilia.Mercado.Equals("ETF") Then
            e.Row.Background = New SolidColorBrush(Color.FromArgb(255, 242, 220, 219))
        End If
        If concilia.EvtNum <> 0 Then
            e.Row.Background = New SolidColorBrush(Color.FromArgb(255, 220, 230, 241))
        End If
    End Sub

    Private Function ValidarBuscaDifRV() As Boolean

        If Me.grdSiBolsa.Items.Count() = 0 Then
            MessageBox.Show("Se debe importar datos SI BOLSA para conciliar cupones.", tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Exclamation)
            Return False
        End If

        If listaETF.Count() = 0 And Me.chkETF.IsChecked Then
            MessageBox.Show("No se ha cargado datos de ETF.", tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Exclamation)
        End If

        If Not Me.chkPosicion.IsChecked And Not Me.chkETF.IsChecked Then
            MessageBox.Show("Se debe seleccionar al menos un tipo de dato a conciliar Posición o ETF.", tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Exclamation)
            Return False
        End If

        Return True

    End Function

    Private Sub grdEnvioEventosRV_CellEditEnding(ByVal sender As System.Object, ByVal e As System.Windows.Controls.DataGridCellEditEndingEventArgs) Handles grdEnvioEventosRV.CellEditEnding
        Dim txtContenidoCelda As Object
        Try
            If e.EditAction <> DataGridEditAction.Cancel Then
                If Not sender.CurrentItem Is Nothing Then
                    txtContenidoCelda = sender.Columns(e.Column.DisplayIndex).GetCellContent(CType(e.Row.Item, CTConciliaCupones))

                    If Not IsNumeric(txtContenidoCelda.Text) Then
                        CType(sender, DataGrid).CancelEdit(DataGridEditingUnit.Cell)
                    Else
                        If Convert.ToDouble(txtContenidoCelda.Text) < 0 Then
                            CType(sender, DataGrid).CancelEdit(DataGridEditingUnit.Cell)
                        End If
                    End If

                Else
                    CType(sender, DataGrid).CancelEdit(DataGridEditingUnit.Cell)
                End If
            End If
        Catch ex As Exception

        End Try
    End Sub

    Private Sub btnEnvioDecalogRV_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnEnvioDecalogRV.Click
        Mouse.OverrideCursor = Cursors.Wait
        If ValidarEnvioDifRV() Then
            Dim eventoBit = CBitacoraFRIDA.GenerarEvento(CBitacoraFRIDA.CveEventosBit.ENVIO_EVENTOS_RV, CServiciosMacrosSyBaseDB.IDUSUARIO, "FLConciliaCupones.xaml -> btnEnvioDecalogRV")
            Try
                If MessageBox.Show("¿Desea enviar los eventos a Decalog?", tituloMensaje, MessageBoxButton.YesNo, MessageBoxImage.Question) = MessageBoxResult.Yes Then
                    Dim NomArchivo As String = ""
                    Dim sMsgError As String = ""
                    Dim listaRV As List(Of CTConciliaCupones) = Me.grdEnvioEventosRV.ItemsSource
                    listaRV = listaRV.FindAll(Function(x) x.Mercado = "DECALOG" And x.Factor > 0 And Not x.FechaSugeridaS.Equals("") And Not x.FechaExcuponS.Equals("") And x.EvtTyp = "DIVREC")
                    eventoBit.GuadarDetalle("Eventos", listaRV.Count())
                    If generalCupones.ConstruirArchivoValmerDecalogRV(listaRV, NomArchivo, sMsgError) Then
                        generalCupones.EjecutarProceso(NomArchivo)
                        actualizaInfo()
                        MessageBox.Show("Operación Exitosa", tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Information)
                    Else
                        Dim errorBit = eventoBit.GuardarError("Error al enviar eventos RV: " & sMsgError)
                        MessageBox.Show("La carga a Decalog no fue exitosa debido a: " & sMsgError & " -Codigo:" & errorBit.IdError, tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Error)
                    End If
                End If
                Dim lista As List(Of CTConciliaCupones) = Me.grdEnvioEventosRV.ItemsSource
                lista = lista.FindAll(Function(x) x.Mercado = "DECALOG" And x.Factor > 0 And Not x.FechaSugeridaS.Equals(""))
                eventoBit.ActualizarFechaFinDelEvento()
            Catch ex As Exception
                Dim errorBit = eventoBit.GuardarError("Error al enviar eventos RV: " & ex.Message)
                eventoBit.ActualizarFechaFinDelEvento()
                Mouse.OverrideCursor = Nothing
                MessageBox.Show("Error TI500. Error al conciliar cupones: " & ex.Message & " -Codigo:" & errorBit.IdError, tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Error)
            End Try

        End If
        Mouse.OverrideCursor = Nothing




    End Sub

    Private Sub actualizaInfo()
        Dim listaSiBolsa As List(Of CTConciliaCupones) = Me.grdSiBolsa.ItemsSource
        Dim lista = generalCupones.ObtieneConciliacionRV(listaETF, listaSiBolsa, Date.Parse(Me.lblFechaRV.Content), Me.chkPosicion.IsChecked, Me.chkETF.IsChecked)
        Dim listaConcilia As List(Of CTConciliaCupones) = Me.grdEnvioEventosRV.ItemsSource
        For Each concilia As CTConciliaCupones In listaConcilia
            If concilia.Mercado.Equals("DECALOG") Then
                Dim inst As Long = concilia.InstNum
                Dim found = lista.Find(Function(x) x.InstNum = inst)
                If found IsNot Nothing Then
                    concilia.EvtNum = found.EvtNum
                    concilia.FechaDecalog = found.FechaDecalog
                End If
            End If

        Next
        listaConcilia = listaConcilia.OrderBy(Function(x) x.Mercado).ToList()
        Me.grdEnvioEventosRV.ItemsSource = listaConcilia
    End Sub

    Private Function ValidarEnvioDifRV() As Boolean

        If Me.grdEnvioEventosRV.Items.Count() = 0 Then
            MessageBox.Show("No existen datos para enviar a Decalog.", tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Exclamation)
            Return False
        End If

        Dim lista As List(Of CTConciliaCupones) = Me.grdEnvioEventosRV.ItemsSource
        lista = lista.FindAll(Function(x) x.Mercado = "DECALOG" And x.Factor > 0 And Not x.FechaSugeridaS.Equals("") And Not x.FechaExcuponS.Equals("") And x.EvtTyp = "DIVREC")


        If lista.Count() = 0 Then
            MessageBox.Show("No existen datos para enviar a Decalog.", tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Exclamation)
            Return False
        End If
        Dim mensajeFechas = New System.Text.StringBuilder()
        For Each concilia As CTConciliaCupones In lista
            If concilia.FechaDecalogS = concilia.FechaSugeridaS Then
                mensajeFechas.AppendLine(concilia.Instrumento)
            End If
        Next

        If mensajeFechas.Length > 0 Then
            MessageBox.Show("Los siguientes instrumentos se les sobreescribira el evento " & vbCrLf & "ya que tienen un evento de dividendo para la misma fecha :" & vbCrLf & mensajeFechas.ToString(), tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Exclamation)
        End If
        Return True

    End Function

    Private Sub btnExportarExcel_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnExportarExcel.Click
        Mouse.OverrideCursor = Cursors.Wait

        If ValidarDatosETF() Then
            Dim eventoBit = CBitacoraFRIDA.GenerarEvento(CBitacoraFRIDA.CveEventosBit.EXPORTAR_ETF, CServiciosMacrosSyBaseDB.IDUSUARIO, "FLConciliaCupones.xaml -> btnExportarExcel")
            Try
                Dim dialog As New Microsoft.Win32.SaveFileDialog()
                dialog.FileName = "Selecciona Directorio"
                dialog.ValidateNames = False
                dialog.CheckFileExists = False
                dialog.CheckPathExists = True
                If dialog.ShowDialog() Then
                    eventoBit.GuadarDetalle("File", dialog.FileName)
                    Dim ruta = dialog.FileName
                    Dim rutaAux() As String = ruta.Split("\")
                    ruta = ruta.Replace(rutaAux(rutaAux.Count - 1), "")
                    Dim lst As List(Of CTConciliaCupones) = Me.grdEnvioEventosRV.ItemsSource
                    'lst = lst.FindAll(Function(x) x.Mercado = "ETF")
                    ExportarDatosETF(lst, ruta)
                    MessageBox.Show("Operación Exitosa", tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Information)
                End If
                eventoBit.ActualizarFechaFinDelEvento()
            Catch ex As Exception
                Dim errorBit = eventoBit.GuardarError("Error al exportar ETF: " & ex.Message)
                eventoBit.ActualizarFechaFinDelEvento()
                Mouse.OverrideCursor = Nothing
                MessageBox.Show("Error TI500. Error al intentar generar Excel: " & ex.Message & " -Codigo:" & errorBit.IdError, tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Error)
            End Try
        End If
        Mouse.OverrideCursor = Nothing

    End Sub

    Private Function ValidarDatosETF() As Boolean

        If Me.grdEnvioEventosRV.Items.Count() = 0 Then
            MessageBox.Show("No existen datos para exportar a Excel.", tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Exclamation)
            Return False
        End If

        'Dim lista As List(Of CTConciliaCupones) = Me.grdEnvioEventosRV.ItemsSource
        'lista = lista.FindAll(Function(x) x.Mercado = "ETF")


        'If lista.Count() = 0 Then
        '    MessageBox.Show("No existen datos de ETF para exportar a Excel.", tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Exclamation)
        '    Return False
        'End If

        Return True

    End Function

    Public Function ExportarDatosETF(ByRef lista As List(Of CTConciliaCupones), ByVal ruta As String) As String

        Dim vn As Integer = 1

        Dim fileName As String = "DIVIDENDOS"
        Dim fechaHoy = Date.Now()
        fileName = fileName & "_" & fechaHoy.ToString("yyyyMMdd") & "_" & fechaHoy.ToString("hhmmss")
        fileName = fileName & ".xls"
        fileName = ruta + fileName

        Dim filaInicio As Integer = 5

        Dim aplicacion As _Application
        Dim libro As Workbook
        Dim hoja As Worksheet

        Try
            aplicacion = CreateObject("Excel.Application")
        Catch ex As Exception
            aplicacion = CreateObject("Excel.Application")
        End Try
        Try
            aplicacion.SheetsInNewWorkbook = 1
            aplicacion.DisplayAlerts = False
            aplicacion.Visible = False
        Catch ex As Exception
            MessageBox.Show("Error al intentar generar Excel", tituloMensaje, MessageBoxButton.OK, MessageBoxImage.Exclamation)
            Return Nothing
        End Try
        libro = aplicacion.Workbooks.Add
        hoja = libro.Sheets(1)
        hoja.Name = "Dividendos"

        'Formato Encabezado

        Dim path As String
        path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
        path = path.Replace("\bin\Debug", "")
        path = path.Replace("file:\", "")
        hoja.Range("B1").ColumnWidth = 22.43
        hoja.Range("C1").ColumnWidth = 22.43
        hoja.Range("D1").ColumnWidth = 22.43
        hoja.Range("E1").ColumnWidth = 22.43
        hoja.Range("F1").ColumnWidth = 22.43
        hoja.Range("G1").ColumnWidth = 22.43
        hoja.Range("H1").ColumnWidth = 22.43
        hoja.Range("I1").ColumnWidth = 22.43
        hoja.Range("J1").ColumnWidth = 22.43


        aplicacion.ActiveSheet.Shapes.AddPicture(path & "\imagenes\LogoAsset.png", False, True, 67, 23, 231, 26)

        With hoja.Range("B5:J5").Borders(XlBordersIndex.xlEdgeTop)
            .LineStyle = XlLineStyle.xlContinuous
            .Weight = XlBorderWeight.xlMedium
            .Color = RGB(22, 54, 92)
        End With

        With hoja.Range("B6:J6").Borders(XlBordersIndex.xlEdgeTop)
            .LineStyle = XlLineStyle.xlContinuous
            .Weight = XlBorderWeight.xlMedium
            .Color = RGB(22, 54, 92)
        End With

        With hoja.Range("B7:J7").Borders(XlBordersIndex.xlEdgeTop)
            .LineStyle = XlLineStyle.xlContinuous
            .Weight = XlBorderWeight.xlMedium
            .Color = RGB(54, 96, 146)
        End With


        hoja.Range("B5:J5").Font.Bold = True

        hoja.Range("B5").Value = "FECHA REGISTRO"
        hoja.Range("C5").Value = "INSTRUMENTO"
        hoja.Range("D5").Value = "MERCADO"
        hoja.Range("E5").Value = "TIPO DE DERECHO"
        hoja.Range("F5").Value = "FECHA PAGO"
        hoja.Range("G5").Value = "FECHA SUGERIDA"
        hoja.Range("H5").Value = "FECHA EXCUPÓN"
        hoja.Range("I5").Value = "MONEDA"
        hoja.Range("J5").Value = "FACTOR"

        hoja.Range("B5:J5").HorizontalAlignment = Constants.xlCenter

        filaInicio = filaInicio + 2

        hoja.Range("B7:B" & (lista.Count() + filaInicio)).NumberFormat = "dd/MM/yyyy"
        hoja.Range("C7:C" & (lista.Count() + filaInicio)).NumberFormat = "@"
        hoja.Range("D7:D" & (lista.Count() + filaInicio)).NumberFormat = "@"
        hoja.Range("E7:E" & (lista.Count() + filaInicio)).NumberFormat = "@"
        hoja.Range("F7:F" & (lista.Count() + filaInicio)).NumberFormat = "dd/MM/yyyy"
        hoja.Range("G7:G" & (lista.Count() + filaInicio)).NumberFormat = "dd/MM/yyyy"
        hoja.Range("H7:H" & (lista.Count() + filaInicio)).NumberFormat = "dd/MM/yyyy"
        hoja.Range("I7:I" & (lista.Count() + filaInicio)).NumberFormat = "@"
        hoja.Range("J7:J" & (lista.Count() + filaInicio)).NumberFormat = "0.000000000"

        hoja.Range("B7:B" & (lista.Count() + filaInicio)).HorizontalAlignment = Constants.xlCenter
        hoja.Range("C7:C" & (lista.Count() + filaInicio)).HorizontalAlignment = Constants.xlLeft
        hoja.Range("D7:D" & (lista.Count() + filaInicio)).HorizontalAlignment = Constants.xlCenter
        hoja.Range("E7:E" & (lista.Count() + filaInicio)).HorizontalAlignment = Constants.xlLeft
        hoja.Range("F7:I" & (lista.Count() + filaInicio)).HorizontalAlignment = Constants.xlCenter
        hoja.Range("J7:J" & (lista.Count() + filaInicio)).HorizontalAlignment = Constants.xlRight

        Dim index As Integer
        For index = 0 To (lista.Count() - 1)
            hoja.Cells(index + filaInicio, 2).value = Date.Parse(Me.lblFechaRV.Content)
            hoja.Cells(index + filaInicio, 3).value = lista(index).Instrumento
            hoja.Cells(index + filaInicio, 4).value = lista(index).Mercado
            hoja.Cells(index + filaInicio, 5).value = lista(index).TipoDerecho
            If lista(index).FechaPago <> Nothing Then
                hoja.Cells(index + filaInicio, 6).value = lista(index).FechaPago
            End If
            If lista(index).FechaSugerida <> Nothing Then
                hoja.Cells(index + filaInicio, 7).value = lista(index).FechaSugerida
            End If
            If lista(index).FechaExcupon <> Nothing Then
                hoja.Cells(index + filaInicio, 8).value = lista(index).FechaExcupon
            End If
            hoja.Cells(index + filaInicio, 9).value = lista(index).CurCod
            hoja.Cells(index + filaInicio, 10).value = lista(index).Factor
        Next

        With hoja.Range("B" & (lista.Count() + filaInicio + 1) & ":J" & (lista.Count() + filaInicio + 1)).Borders(XlBordersIndex.xlEdgeTop)
            .LineStyle = XlLineStyle.xlContinuous
            .Weight = XlBorderWeight.xlMedium
            .Color = RGB(54, 96, 146)
        End With


        libro.SaveAs(fileName, XlFileFormat.xlWorkbookNormal, Type.Missing, _
                     Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlExclusive, _
                     Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing)

        ReleaseObject(hoja)
        libro.Close(False, Type.Missing, Type.Missing)
        ReleaseObject(libro)
        aplicacion.Quit()
        ReleaseObject(aplicacion)
        GC.Collect()
        Return fileName
    End Function

    Public Sub ReleaseObject(ByVal o As Object)
        Try
            While (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0)
            End While
        Catch
        Finally
            o = Nothing
        End Try
    End Sub

#End Region

End Class
